﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Controllers;
using GestorDeFlotasDesktop.Listados;

namespace GestorDeFlotasDesktop
{
    public partial class AbmRol : Form
    {
        public AbmRol()
        {
            InitializeComponent();
        }
        #region Propiedades

        public lstRoles parentForm { get; set; }
        public Rol Rol { get; set; }
        public Operacion operacion { get; set; }
        private bool valido = true;

        #endregion

        #region Eventos

        private void AbmRol_Load(object sender, EventArgs e)
        {
            if (operacion == Operacion.Alta)
            {
                chkHabilitado.Checked = true;
                lblOperacion.Text = "Nuevo";
            }
            else
            {
                CargarForm();
                if (operacion == Operacion.Baja)
                {
                    InhabilitarForm();
                    lblOperacion.Text = "Eliminar";
                    btnLimpiar.Enabled = false;
                }
                else
                {
                    lblOperacion.Text = "Modificar";
                }
            }
            CargarFuncionalidades();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {

            if (operacion == Operacion.Baja)
            {
                RolController.Eliminar(Rol.Rol_Id);
                MessageBox.Show("El Rol fue eliminado con éxito");
                if (parentForm != null) parentForm.ActualizarGrilla();
                Close();
            }
            else
            {

                ValidarForm(sender, e);
                if (valido)
                {
                    var lstFuncionalidades = (List<Funcionalidad>)gvwFuncionalidades.DataSource;

                    if (operacion == Operacion.Alta)
                    {
                        Rol = CargarObjeto();
                        RolController.Agregar(Rol, lstFuncionalidades);
                        MessageBox.Show("El Rol fue dado de alta con éxito");
                    }
                    else if (operacion == Operacion.Modificacion)
                    {
                        Rol = CargarObjeto();
                        RolController.Modificar(Rol, lstFuncionalidades);
                        MessageBox.Show("El Rol fue modificado con éxito");
                    }

                    LimpiarForm();
                    Rol = null;
                    if (parentForm != null) parentForm.ActualizarGrilla();
                    Close();
                }
                valido = true;
            }



        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            LimpiarForm();
        }

        #endregion

        #region Metodos del Form

        private Rol CargarObjeto()
        {
            if (Rol == null) Rol = new Rol();

            Rol.Rol_Nombre = txtNombre.Text;
            Rol.Rol_Habilitado = chkHabilitado.Checked;

            return Rol;
        }

        private void CargarForm()
        {
            txtNombre.Text = Rol.Rol_Nombre;
            chkHabilitado.Checked = Rol.Rol_Habilitado;
        }

        private void LimpiarForm()
        {
            txtNombre.Text = "";
            chkHabilitado.Checked = true;
            CargarFuncionalidades();
        }

        private void InhabilitarForm()
        {
            txtNombre.Enabled = false;
            chkHabilitado.Enabled = false;
            gvwFuncionalidades.Enabled = false;
        }

        private void CargarFuncionalidades()
        {
            var rolId = operacion == Operacion.Alta ? 0 : Rol.Rol_Id;

            gvwFuncionalidades.AutoGenerateColumns = false;
            gvwFuncionalidades.DataSource = RolController.ObtenerFuncionalidades(rolId);

            var colId = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Funcionalidad_Id",
                Name = "Funcionalidad_Id",
                HeaderText = "Id",
                ReadOnly = true,
                Width = 50
            };
            gvwFuncionalidades.Columns.Add(colId);

            var colnombre = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Funcionalidad_Nombre",
                Name = "Funcionalidad_Nombre",
                HeaderText = "Funcionalidad",
                ReadOnly = true,
                Width = 150
            };
            gvwFuncionalidades.Columns.Add(colnombre);

            var colHabilitado = new DataGridViewCheckBoxColumn
            {
                DataPropertyName = "Funcionalidad_Seleccionada",
                Name = "Funcionalidad_Seleccionada",
                HeaderText = "Asignar",
                Width = 80
            };
            gvwFuncionalidades.Columns.Add(colHabilitado);

        }

        #endregion

        #region Validaciones


        private void ValidarForm(object sender, EventArgs e)
        {
            valido = true;
            txtNombre_Validated(sender, e);
            ValidarFuncionalidades();
        }

        private void txtNombre_Validated(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtNombre.Text))
            {
                errProvider.SetError(txtNombre, "Debe ingresar el nombre del Rol");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtNombre, "");
            }
        }


        private void ValidarFuncionalidades()
        {
            var lstFuncionalidades = (List<Funcionalidad>)gvwFuncionalidades.DataSource;

            if (!lstFuncionalidades.Any(x => x.Funcionalidad_Seleccionada))
            {
                errProvider.SetError(gvwFuncionalidades, "Debe seleccionar al menos una funcionalidad");
                valido = false;
            }
            else
            {
                errProvider.SetError(gvwFuncionalidades, "");
            }

        }

        #endregion
    }
}
